package com.hoodbrains.insideloc.maps.UI;


import com.hoodbrains.insideloc.R;
import com.hoodbrains.insideloc.maps.Liste;
import com.hoodbrains.insideloc.maps.Magasin;

import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;

import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.FloatMath;


import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;


public class DrawingView extends View implements android.content.DialogInterface.OnClickListener{
	private ScaleGestureDetector mScaleDetector;
	public float mScaleFactor = 1.0f;
	private static final int INVALID_POINTER_ID = -1;
	public Matrix matrix;
	Magasin supermarket;
	public float mPosX = 0.f;
	public float mPosY = 0.f;
	
	private float mLastTouchX;
	private float mLastTouchY;
	private int mActivePointerId = INVALID_POINTER_ID;
	
	private Liste liste;
	
	public DrawingView(Context context, AttributeSet attrs) {
		super(context, attrs);
		
		mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		// Let the ScaleGestureDetector inspect all events.
		mScaleDetector.onTouchEvent(ev);

		final int action = ev.getAction();
		switch (action & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN: {
			final float x = ev.getX();
			final float y = ev.getY();

			mLastTouchX = x;
			mLastTouchY = y;
			mActivePointerId = ev.getPointerId(0);
			break;
		}

		case MotionEvent.ACTION_MOVE: {
			final int pointerIndex = ev.findPointerIndex(mActivePointerId);
			final float x = ev.getX(pointerIndex);
			final float y = ev.getY(pointerIndex);

			// Only move if the ScaleGestureDetector isn't processing a gesture.
			if (!mScaleDetector.isInProgress()) {
				final float dx = x - mLastTouchX;
				final float dy = y - mLastTouchY;

				mPosX += dx;
				mPosY += dy;

				invalidate();
			}

			mLastTouchX = x;
			mLastTouchY = y;

			break;
		}

		case MotionEvent.ACTION_UP: {
			mActivePointerId = INVALID_POINTER_ID;
			break;
		}

		case MotionEvent.ACTION_CANCEL: {
			mActivePointerId = INVALID_POINTER_ID;
			break;
		}

		case MotionEvent.ACTION_POINTER_UP: {
			final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
			final int pointerId = ev.getPointerId(pointerIndex);
			if (pointerId == mActivePointerId) {
				// This was our active pointer going up. Choose a new
				// active pointer and adjust accordingly.
				final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
				mLastTouchX = ev.getX(newPointerIndex);
				mLastTouchY = ev.getY(newPointerIndex);
				mActivePointerId = ev.getPointerId(newPointerIndex);
			}
			break;
		}
		}

		return true;
	}

	public Magasin getSupermarket() {
		return supermarket;
	}

	public void setSupermarket(Magasin supermarket) {
		this.supermarket = supermarket;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		
		canvas.save();
		
		matrix = canvas.getMatrix();
		canvas.translate(getWidth()/2,getHeight()/2);
	
		canvas.translate(mPosX, mPosY);
		//canvas.rotate(180);
		canvas.scale(mScaleFactor,- mScaleFactor);
		
		if (supermarket != null)
		{
			supermarket.draw(canvas);
		}
		
		if (liste!=null){
		liste.draw(canvas);
		}




		canvas.restore();

	}
	
	public void centerOn(int x , int y)
	{
		int currentX=  (getRight()-getLeft());
		int currentY = (getTop()- getBottom());
		mPosX =  currentX -x ;
		mPosY =  y -currentY ;
		invalidate();
	}
	public class ScaleListener extends
			ScaleGestureDetector.SimpleOnScaleGestureListener {

		@Override
		public boolean onScale(ScaleGestureDetector detector) {
			mScaleFactor *= detector.getScaleFactor();

			// Don't let the object get too small or too large.
			mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

			invalidate();
			return true;
		}

	}

	
	/**
	 * space between the first two fingers
	 */
	private float spacing(MotionEvent event) {
		// ...
		float x = event.getX(0) - event.getX(1);
		float y = event.getY(0) - event.getY(1);
		return FloatMath.sqrt(x * x + y * y);
	}

	private PointF spacingPoint(MotionEvent event) {
		PointF f = new PointF();
		f.x = event.getX(0) - event.getX(1);
		f.y = event.getY(0) - event.getY(1);
		return f;
	}

	/**
	 * the mid point of the first two fingers
	 */
	private void midPoint(PointF point, MotionEvent event) {
		// ...
		float x = event.getX(0) + event.getX(1);
		float y = event.getY(0) + event.getY(1);
		point.set(x / 2, y / 2);
	}
	
	public void setListe (Liste liste){
		this.liste = liste;
		
		
	}
	
	public Liste getListe(){
		return this.liste;
	}

	

	public void onClick(DialogInterface dialog, int which) {
		// TODO Auto-generated method stub
		
	}

}
